home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / PRUS101.ZIP / FCONDRV.INC < prev    next >
Text File  |  1994-12-20  |  13KB  |  515 lines

  1.  
  2. { FCONDRV.INC - include file to partially clone CRT's functions for usage by
  3.                 the PRUSSG unit FCRT
  4.   ***************************************************************************
  5.  
  6.          RELEASE 1.08 - as first contained in the file PRUS101.LZH
  7.                  by Paul Schubert, 2:244/1181.18,  GERMANY
  8.  
  9.                --------------------------------------------
  10.                 organized for Fido's PASCAL related echoes
  11.                --------------------------------------------
  12.  
  13.     06/21/1994 to --/--/---- by Paul Schubert, 2:244/1181.18,  GERMANY
  14.  
  15.  
  16.            As far as third party copyrights are not violated this
  17.            source code is hereby placed to the public domain. Use
  18.            it whatever way you want, but use AT YOUR OWN RISK.
  19.  
  20.            In case you should modify the source rather send your
  21.            modifications to the unit's current organizer (see above for
  22.            NM address) than to spread it on your own. This will help to
  23.            keep the unit updated and grant a certain standard to all
  24.            other users as well.
  25.  
  26.            The unit is currently still under work. So it might greatly
  27.            benefit of your participation.
  28.  
  29.            Those who contributed to the following piece of source,
  30.            listed in alphabethical order:
  31.         ================================================================
  32.            Orazio Czerwenka, Paul Schubert ...
  33.         ================================================================
  34.            YOUR NAME WILL APPEAR HERE IF YOU CONTRIBUTE USEFUL SOURCE.
  35.  
  36.            Credits in your own programs are as welcome as unnecessary.
  37.  
  38.  ***************************************************************************}
  39.  
  40. TYPE  CPOSTYPE      = RECORD X,Y : BYTE END;
  41.       WORDARRAY     = ARRAY[0..$FFF] OF WORD;
  42.       PWORDARRAY    = ^WORDARRAY;
  43.       SOF           = RECORD O,S : WORD END;
  44.       WINDOWPTR     = ^WINDOWTYP;
  45.       WINDOWTYP     = RECORD
  46.         NXT      : WINDOWPTR;
  47.         X,Y,W,H  : BYTE;
  48.         DATEN    : ARRAY[0..0] OF BYTE;
  49.       END;
  50.       CURSORTYPE    = ARRAY[0..7] OF CPOSTYPE;
  51.  
  52.  
  53. CONST WINDPTR           : WINDOWPTR = NIL;
  54.  
  55.  
  56. VAR
  57.       CURSOR            : CURSORTYPE ABSOLUTE $40:$50;
  58.  
  59.       LINEWIDTH         : WORD;
  60.       WINDWIDTH         : BYTE;
  61.       WINDHEIGHT        : BYTE;
  62.  
  63.       WMI,WMA           : ARRAY[0..7] OF WORD;
  64.  
  65.  
  66. PROCEDURE STI;   INLINE($FB);
  67. PROCEDURE CLI;   INLINE($FA);
  68. PROCEDURE PUSHF; INLINE($9C);
  69. PROCEDURE POPF;  INLINE($9D);
  70.  
  71.  
  72. PROCEDURE SETPORT(PORTADR:WORD;INDEX,DAT:BYTE);
  73. BEGIN
  74.   PUSHF;
  75.   CLI;
  76.   PORT[PORTADR] := INDEX;
  77.   PORT[PORTADR+1] := DAT;
  78.   POPF;
  79. END;
  80.  
  81.  
  82. FUNCTION CURSORPOINTER:POINTER;
  83. BEGIN
  84.   CURSORPOINTER := PTR(VIDEORAM,VideoPageSize*ACTIVEVIDEOPAGE
  85.                        +(WORD(MaxX)*CURSOR[ACTIVEVIDEOPAGE].Y
  86.                        +CURSOR[ACTIVEVIDEOPAGE].X) SHL 1);
  87. END; { CURSORPOINTER }
  88.  
  89.  
  90. FUNCTION SCREENPOINTER:POINTER;
  91. BEGIN
  92.   SCREENPOINTER := PTR(VIDEORAM,VideoPageSize*ACTIVEVIDEOPAGE);
  93. END; { SCREENPOINTER }
  94.  
  95.  
  96. FUNCTION WINDOWPOINTER:POINTER;
  97. BEGIN
  98.   WINDOWPOINTER := PTR(VIDEORAM,VideoPageSize*ACTIVEVIDEOPAGE
  99.                        +LINEWIDTH*HI(WINDMIN)
  100.                        +(LO(WINDMIN) SHL 1));
  101. END; { WINDOWPOINTER }
  102.  
  103.  
  104. PROCEDURE FILLWORD(START:PWORDARRAY;ANZAHL,DATEN:WORD);
  105. ASSEMBLER;
  106. ASM
  107.   LES DI,START
  108.   MOV CX,ANZAHL
  109.   MOV AX,DATEN
  110.   CLD
  111.   REP STOSW
  112. END; { FILLWORD }
  113. {
  114. FCRT.FILLWORD: ASM                                           
  115.   cs:00B8 55             push   bp                           
  116.   cs:00B9 89E5           mov    bp,sp                        
  117. FCRT.FCONDRV.INC.107:  LES DI,START                          
  118.   cs:00BB C47E0A         les    di,[bp+0A]                   
  119. FCRT.FCONDRV.INC.108:  MOV CX,ANZAHL                         
  120.   cs:00BE 8B4E08         mov    cx,[bp+08]                   
  121. FCRT.FCONDRV.INC.109:  MOV AX,DATEN                          
  122.   cs:00C1 8B4606         mov    ax,[bp+06]                   
  123. FCRT.FCONDRV.INC.110:  CLD                                   
  124.   cs:00C4 FC             cld                                 
  125. FCRT.FCONDRV.INC.111:  REP STOSW                             
  126.   cs:00C5 F3AB           rep stosw                           
  127. FCRT.FCONDRV.INC.112: END;
  128.   cs:00C7 C9             leave                               
  129.   cs:00C8 CA0800         retf   0008                         
  130. }
  131.  
  132. PROCEDURE SCROLL;
  133. VAR   Y      : BYTE;
  134.       P1,P2  : POINTER;
  135.       R      : REGISTERS;
  136. BEGIN
  137.   IF DIRECTVIDEO THEN BEGIN
  138.     P1  := WINDOWPOINTER;
  139.     P2  := P1; INC(SOF(P2).O,LINEWIDTH);
  140.  
  141.     FOR Y := SUCC(HI(WINDMIN)) TO SUCC(HI(WINDMAX)) DO BEGIN
  142.       MOVE(P2^,P1^,WINDWIDTH SHL 1);
  143.       P1 := P2;
  144.       INC(SOF(P2).O,LINEWIDTH);
  145.     END; { NEXT Y }
  146.  
  147.     DEC(SOF(P1).O,LINEWIDTH);
  148.     FILLWORD(P1,WINDWIDTH,WORD(TEXTATTR) SHL 8 + $20);
  149.   END ELSE BEGIN
  150.     R.AH := 5;
  151.     R.AL := ACTIVEVIDEOPAGE;
  152.     INTR($10,R);
  153.     R.AX := $601;
  154.     R.BH := TEXTATTR;
  155.     R.CX := WINDMIN;
  156.     R.DX := WINDMAX;
  157.     INTR($10,R);
  158.   END;
  159. END; { SCROLL }
  160.  
  161.  
  162. {
  163.   SCROLLABSOLUTE WIRD NIRGENDS GEBRAUCHT
  164. }
  165. PROCEDURE SCROLLABSOLUTE;
  166. VAR   R  : REGISTERS;
  167. BEGIN
  168.   IF DIRECTVIDEO THEN BEGIN
  169.     MOVE(MEM[VIDEORAM:VideoPageSize*ACTIVEVIDEOPAGE+LINEWIDTH],
  170.          SCREENPOINTER^,
  171.          LINEWIDTH*MaxY);
  172.     FILLWORD(PTR(VIDEORAM,VideoPageSize*ACTIVEVIDEOPAGE+
  173.              MaxY*LINEWIDTH),
  174.              MaxX,
  175.              WORD(TEXTATTR) SHL 8 + $20);
  176.   END ELSE BEGIN
  177.     R.AH := 5;
  178.     R.AL := ACTIVEVIDEOPAGE;
  179.     INTR($10,R);
  180.     R.AX := $601;
  181.     R.BH := TEXTATTR;
  182.     R.CX := 0;
  183.     R.DH := SUCC(MaxY);
  184.     R.DL := MaxX;
  185.     INTR($10,R);
  186.   END;
  187. END; { SCROLLABSOLUTE }
  188.  
  189.  
  190. PROCEDURE WINDOW(x,y,xx,yy:BYTE);
  191. BEGIN
  192.   IF (WHEREX < x) OR (WHEREY < y) OR (WHEREX > xx) OR (WHEREY > yy)
  193.     THEN GOTOXYABSOLUTE(x,y);
  194.   WINDMIN := PRED(y)  SHL 8 + PRED(x);
  195.   WINDMAX := PRED(yy) SHL 8 + PRED(xx);
  196.   WMI[ACTIVEVIDEOPAGE] := WINDMIN;
  197.   WMA[ACTIVEVIDEOPAGE] := WINDMAX;
  198.   WINDWIDTH  := SUCC(xx-x);
  199.   WINDHEIGHT := SUCC(yy-y);
  200. END; { WINDOW }
  201.  
  202.  
  203. PROCEDURE PUSHWINDOW;
  204. VAR   YY,WID     : WORD;
  205.       OLDP       : WINDOWPTR;
  206.       DATP,VIDP  : POINTER;
  207. BEGIN
  208.   OLDP := WINDPTR;
  209.   WID  := WINDWIDTH SHL 1;
  210.  
  211.   GETMEM(WINDPTR,WID*WINDHEIGHT+SIZEOF(WINDOWTYP));
  212.  
  213.   WITH WINDPTR^ DO BEGIN
  214.     NXT := OLDP;
  215.     X := LO(WINDMIN);
  216.     Y := HI(WINDMIN);
  217.     W := WID;
  218.     H := WINDHEIGHT;
  219.     DATP := @WINDPTR^.DATEN;
  220.     VIDP := WINDOWPOINTER;
  221.     FOR YY := Y TO PRED(Y+H) DO BEGIN
  222.       MOVE(VIDP^,DATP^,W);
  223.       INC(SOF(DATP).O,W);
  224.       INC(SOF(VIDP).O,LINEWIDTH);
  225.     END; { NEXT Y }
  226.   END; { WITH }
  227. END; { PUSHWINDOW }
  228.  
  229.  
  230. PROCEDURE POPWINDOW;
  231. VAR   YY        : WORD;
  232.       OLDP      : WINDOWPTR;
  233.       DATP,VIDP : POINTER;
  234. BEGIN
  235.   IF WINDPTR = NIL THEN EXIT;
  236.  
  237.   WITH WINDPTR^ DO BEGIN
  238.     OLDP := NXT;
  239.     DATP := @WINDPTR^.DATEN;
  240.     VIDP := PTR(VIDEORAM,VideoPageSize*ACTIVEVIDEOPAGE+(Y * MaxX + X) SHL 1);
  241.     FOR YY := Y TO PRED(Y+H) DO BEGIN
  242.       MOVE(DATP^,VIDP^,W);
  243.       INC(SOF(DATP).O,W);
  244.       INC(SOF(VIDP).O,LINEWIDTH);
  245.     END; { NEXT Y }
  246.     FREEMEM(WINDPTR,W*H+SIZEOF(WINDOWTYP));
  247.   END; { WITH }
  248.   WINDPTR := OLDP;
  249. END; { POPWINDOW }
  250.  
  251.  
  252. PROCEDURE MOVECURSOR;
  253. VAR   I  : WORD;
  254. BEGIN
  255.   I := VideoPageSize * ACTIVEVIDEOPAGE +
  256.        WORD(MaxX)*CURSOR[ACTIVEVIDEOPAGE].Y+
  257.        CURSOR[ACTIVEVIDEOPAGE].X;
  258.   SETPORT(CRTC,$E,HI(I));
  259.   SETPORT(CRTC,$F,I);
  260. END; { MOVECURSOR }
  261.  
  262.  
  263. PROCEDURE GOTOXYABSOLUTE(X,Y:BYTE);
  264. BEGIN
  265.   CURSOR[ACTIVEVIDEOPAGE].X := PRED(X);
  266.   CURSOR[ACTIVEVIDEOPAGE].Y := PRED(Y);
  267.   MOVECURSOR;
  268. END; { GOTOXYABSOLUTE }
  269.  
  270.  
  271. PROCEDURE GOTOXY(X,Y:BYTE);
  272. BEGIN
  273.   CURSOR[ACTIVEVIDEOPAGE].X := PRED(X)+LO(WINDMIN);
  274.   CURSOR[ACTIVEVIDEOPAGE].Y := PRED(Y)+HI(WINDMIN);
  275.   MOVECURSOR;
  276. END; { GOTOXY }
  277.  
  278.  
  279. PROCEDURE CLRSCRABSOLUTE;
  280. VAR   R  : REGISTERS;
  281. BEGIN
  282.   IF DIRECTVIDEO THEN BEGIN
  283.     GOTOXYABSOLUTE(1,1);
  284.     FILLWORD(SCREENPOINTER,VideoPageSize SHR 1,
  285.              WORD(TEXTATTR) SHL 8 + $20);
  286.   END ELSE BEGIN
  287.     R.AH := 5;
  288.     R.AL := ACTIVEVIDEOPAGE;
  289.     INTR($10,R);
  290.     R.AX := $600;
  291.     R.BH := TEXTATTR;
  292.     R.CX := 0;
  293.     R.DH := SUCC(MaxY);
  294.     R.DL := MaxX;
  295.     INTR($10,R);
  296.   END;
  297. END; { CLRSCRABSOLUTE }
  298.  
  299.  
  300. PROCEDURE CLRSCR;
  301. VAR   Y,AW  : WORD;
  302.       P1    : POINTER;
  303. VAR   R     : REGISTERS;
  304. BEGIN
  305.   GOTOXY(1,1);
  306.   IF DIRECTVIDEO THEN BEGIN
  307.     P1  := WINDOWPOINTER;
  308.     AW  := WORD(TEXTATTR) SHL 8 + $20;
  309.     FOR Y := HI(WINDMIN) TO HI(WINDMAX) DO BEGIN
  310.       FILLWORD(P1,WINDWIDTH,AW);
  311.       INC(SOF(P1).O,LINEWIDTH);
  312.     END; { NEXT Y }
  313.   END ELSE BEGIN
  314.     R.AH := 5;
  315.     R.AL := ACTIVEVIDEOPAGE;
  316.     INTR($10,R);
  317.     R.AX := $600;
  318.     R.BH := TEXTATTR;
  319.     R.CX := WINDMIN;
  320.     R.DX := WINDMAX;
  321.     INTR($10,R);
  322.   END;
  323. END; { CLRSCR }
  324.  
  325.  
  326. PROCEDURE CLREOL;
  327. VAR   R  : REGISTERS;
  328. BEGIN
  329.   IF DIRECTVIDEO THEN BEGIN
  330.     FILLWORD(CURSORPOINTER,
  331.              LO(WINDMAX)-WHEREXABSOLUTE + 2,
  332.              WORD(TEXTATTR) SHL 8 + $20
  333.             );
  334.   END ELSE BEGIN
  335.     R.AX := $920;
  336.     R.BH := ACTIVEVIDEOPAGE;
  337.     R.BL := TEXTATTR;
  338.     R.CX := LO(WINDMAX)-WHEREXABSOLUTE + 2;
  339.     INTR($10,R);
  340.   END;
  341. END; { CLREOL }
  342.  
  343.  
  344. PROCEDURE CLREOS;
  345. VAR   Y,AW  : WORD;
  346.       P1    : POINTER;
  347.       R     : REGISTERS;
  348. BEGIN
  349.   P1  := PTR(VIDEORAM,VideoPageSize*ACTIVEVIDEOPAGE
  350.                       +WHEREYABSOLUTE*LINEWIDTH + LO(WINDMIN) SHL 1);
  351.   AW  := WORD(TEXTATTR) SHL 8 + $20;
  352.   CLREOL;
  353.   IF DIRECTVIDEO THEN BEGIN
  354.     FOR Y := WHEREYABSOLUTE TO HI(WINDMAX) DO BEGIN
  355.       FILLWORD(P1,WINDWIDTH,AW);
  356.       INC(SOF(P1).O,LINEWIDTH);
  357.     END; { NEXT Y }
  358.   END ELSE BEGIN
  359.     Y := WHEREYABSOLUTE;
  360.     IF Y < HI(WINDMAX) THEN BEGIN
  361.       R.AH := 5;
  362.       R.AL := ACTIVEVIDEOPAGE;
  363.       INTR($10,R);
  364.       R.AH := $6;
  365.       R.AL := Hi (WindMax) - y + 1;
  366.       R.BH := TEXTATTR;
  367.       R.CH := Y;
  368.       R.CL := LO(WINDMIN);
  369.       R.DX := WINDMAX;
  370.       INTR($10,R);
  371.     END;
  372.   END;
  373. END; { CLREOS }
  374.  
  375.  
  376. FUNCTION  WHEREXABSOLUTE:BYTE;
  377. BEGIN
  378.   WHEREXABSOLUTE := SUCC(CURSOR[ACTIVEVIDEOPAGE].X);
  379. END; { WHEREXABSOLUTE }
  380.  
  381.  
  382. FUNCTION  WHEREYABSOLUTE:BYTE;
  383. BEGIN
  384.   WHEREYABSOLUTE := SUCC(CURSOR[ACTIVEVIDEOPAGE].Y);
  385. END; { WHEREYABSOLUTE }
  386.  
  387.  
  388. FUNCTION  WHEREX:BYTE;
  389. BEGIN
  390.   WHEREX := SUCC(CURSOR[ACTIVEVIDEOPAGE].X)-LO(WINDMIN);
  391. END; { WHEREX }
  392.  
  393.  
  394. FUNCTION  WHEREY:BYTE;
  395. BEGIN
  396.   WHEREY := SUCC(CURSOR[ACTIVEVIDEOPAGE].Y)-HI(WINDMIN);
  397. END; { WHEREY }
  398.  
  399.  
  400. FUNCTION COUT(VAR F:TEXTREC):WORD;
  401. VAR   I,CW  : WORD;
  402.       CP    : CPOSTYPE;
  403.       WPTR  : ^WORD;
  404.       CPTR  : ^BYTE;
  405.       R     : REGISTERS;
  406.  
  407. PROCEDURE LINEFEED;
  408. BEGIN
  409.   IF CP.Y < HI(WINDMAX) THEN BEGIN
  410.     INC(CP.Y);
  411.   END ELSE BEGIN
  412.     SCROLL;
  413.   END;
  414.   CURSOR[ACTIVEVIDEOPAGE] := CP;
  415.   WPTR := CURSORPOINTER;
  416. END; { LINEFEED }
  417.  
  418. BEGIN { COUT }
  419.   WITH F DO BEGIN
  420.     IF BUFPOS > 0 THEN BEGIN
  421.       CP   := CURSOR[ACTIVEVIDEOPAGE];
  422.       WPTR := CURSORPOINTER;
  423.       CPTR := POINTER(BUFPTR);
  424.       CW   := WORD(TEXTATTR) SHL 8;
  425. {---
  426.   this is the lowest level output routine :
  427.   BUFPTR^ contains BUFPOS chars for output
  428. }
  429.       FOR I := 0 TO PRED(BUFPOS) DO BEGIN
  430.         CASE BUFPTR^[I] OF
  431.           ^G : BEGIN { DAS SOLL PIEPSEN }
  432.                  R.AX := $E07;
  433.                  INTR($10,R);
  434.                END;
  435.           ^M : BEGIN
  436.                  CP.X := LO(WINDMIN);
  437.                  WPTR := CURSORPOINTER;
  438.                END;
  439.           ^J : LINEFEED;
  440.         ELSE
  441.           IF DIRECTVIDEO THEN BEGIN
  442.             WPTR^ := CW OR CPTR^;
  443.             INC(SOF(WPTR).O,2);
  444.           END ELSE BEGIN
  445.             R.AH := 9;
  446.             R.AL := CPTR^;
  447.             R.BH := ACTIVEVIDEOPAGE;
  448.             R.BL := TEXTATTR;
  449.             R.CX := 1;
  450.             INTR($10,R);
  451.           END;
  452.           INC(SOF(CPTR).O);
  453.  
  454.           IF CP.X < (LO(WINDMAX)) THEN BEGIN
  455.             INC(CP.X);
  456.           END ELSE BEGIN
  457.             CP.X := LO(WINDMIN);
  458.             LINEFEED;
  459.           END;
  460.           IF NOT DIRECTVIDEO THEN CURSOR[ACTIVEVIDEOPAGE] := CP;
  461.         END; { CASE }
  462.       END; { NEXT I }
  463. {---}
  464.       BUFPOS := 0;
  465.       CURSOR[ACTIVEVIDEOPAGE] := CP;
  466.       MOVECURSOR;
  467.     END; { IF BUFPOS > 0 }
  468.   END; { WITH F }
  469.   COUT := 0;
  470. END; { COUT }
  471.  
  472.  
  473. FUNCTION COPEN(VAR F:TEXTREC):WORD;
  474. BEGIN
  475.   F.MODE := FMOUTPUT;
  476.   COPEN := 0;
  477. END; { COPEN }
  478.  
  479.  
  480. FUNCTION CCLOSE(VAR F:TEXTREC):WORD;
  481. BEGIN
  482.   F.MODE := FMCLOSED;
  483.   CCLOSE := 0;
  484. END; { CCLOSE }
  485.  
  486.  
  487. PROCEDURE ASSIGNFCRT(VAR F:TEXT);
  488. BEGIN
  489.   WITH TEXTREC(F) DO BEGIN
  490.     MODE := FMCLOSED;
  491.     OPENFUNC  := @COPEN;
  492.     FLUSHFUNC := @COUT;
  493.     CLOSEFUNC := @CCLOSE;
  494.     INOUTFUNC := @COUT;
  495.     BUFEND    := 0;
  496.     BUFPOS    := 0;
  497.     BUFPTR    := @BUFFER;
  498.     NAME[0]   := #0;
  499.   END;
  500. END; { ASSIGNFCRT }
  501.  
  502.  
  503. PROCEDURE REINITFCONDRV;
  504. BEGIN
  505.   CRTC          := MEMW[$40:$63];
  506.   LINEWIDTH     := MaxX SHL 1;
  507.   WINDMAX       := WORD(PRED(MaxY)) SHL 8 + PRED(MaxX);
  508.   WINDMIN       := 0;
  509.   WINDWIDTH  := SUCC(WindMax AND $FF);
  510.   WINDHEIGHT := SUCC((WindMax SHR 8) AND $FF);
  511.   FILLWORD(@WMI,8,WINDMIN);
  512.   FILLWORD(@WMA,8,WINDMAX);
  513.  
  514. END; { REINITCRT }
  515.